package com.gilgamesh.mall.sdk.util;

import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Map;

/**
 * 检查bean中字段
 * isLogicalNull和isFullNull对逻辑空的判断不同
 *
 * @author yanm
 * @date 2021/1/6 14:24
 **/
public class BeanUtil {

    /**
     * 判断一个引用类型（非集合类型）是否为逻辑空，(即对象==null或者对象不为null但是它的所有属性都为null)
     *
     * @param object 引用对象
     * @return 逻辑空返回true、不为空返回false
     * @author yanm
     * @date 2020/12/31 13:33
     **/
    public static boolean isLogicalNull(Object object) {
        if (object == null) {
            return true;
        }
        Field[] declaredFields = object.getClass().getDeclaredFields();
        for (Field f : declaredFields) {
            f.setAccessible(true);
            try {
                if (f.get(object) != null) {
                    return false;
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return true;
    }

    /**
     * 判断一个引用类型是否为逻辑空，(即对象==null或者对象不为null但是它存在一条属性为null)
     *
     * @param object 引用对象
     * @return 逻辑空返回true、不为空返回false
     * @author yanm
     * @date 2020/12/31 13:33
     **/
    public static boolean isFullNull(Object object) {
        if (object == null) {
            return true;
        }
        Field[] declaredFields = object.getClass().getDeclaredFields();
        for (Field f : declaredFields) {
            f.setAccessible(true);
            try {
                if (f.get(object) == null) {
                    return true;
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        return false;
    }

    /**
     * 对属性名为fieldName之外的元素置为空,要求非集合，非map
     *
     * @param object     目标对象
     * @param fieldNames 保留属性名数组
     * @return 将fieldName之外的属性置为null的对象
     * @author yanm
     * @date 2020/12/31 16:34
     **/
    public static Object deleteUnNeedFields(Object object, String[] fieldNames) {
        if (object == null || fieldNames == null || fieldNames.length == 0) {
            return null;
        }
        if (object instanceof Collection || object instanceof Map) {
            return null;
        }
        Field[] declaredFields = object.getClass().getDeclaredFields();
        for (Field f : declaredFields) {
            f.setAccessible(true);
            if (!StringUtil.contains(fieldNames, f.getName())) {
                try {
                    f.set(object, null);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        return object;
    }


}
